package com.example.miaosha.common.utils;

import com.example.miaosha.common.exception.TokenExpireException;
import com.example.miaosha.common.utils.jwt.JwtUtil;
import com.example.miaosha.common.utils.redis.RedisKeys;
import com.example.miaosha.common.utils.redis.RedisUtil;
import com.example.miaosha.entity.SeUser;
import com.example.miaosha.entity.user.PtUser;
import com.example.miaosha.service.SeUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * 用户信息获取Util
 *
 * @Author
 * @Date 2021/12/29 19:00
 */
@Component
public class UserRepositoryUtil {

    @Resource
    private RedisUtil redisUtil;

    @Resource
    private JwtUtil jwtConfig;

    @Resource
    private SeUserService userService;

    /**
     * 获取用户详细信息
     *
     * @param user
     * @return
     */
    public PtUser querySysUserDetail(PtUser user) {
        // 传过来的 用户的 Token
//        String userToken = user.getToken();
        String userId = user.getId();
        // 从 token 中解析 Redis 使用的键值
        String userKey = RedisKeys.getPtUserKey(userId);
        // 从缓存中拿到用户信息
        PtUser userInfo = null;
        try {
            userInfo = (PtUser) redisUtil.get(userKey);
        } catch (Exception e) {
            userInfo = null;
        }
        if (Objects.nonNull(userInfo)) {
//            if (!StringUtils.equals(userId, userInfo.getId())) {
            // 获取用户token过期时间
//                long userTokenExp = jwtConfig.getTokenExpiresAt(userId);
            // 获取缓存token过期时间
//                long cacheTokenExp = jwtConfig.getTokenExpiresAt(userInfo.getToken());
//                if (userTokenExp < cacheTokenExp) {
            // 如果用户token过期时间 < 缓存token过期时间，则抛token过期异常
//                    throw new TokenExpireException(userId);
//                }
//            }else {
            return userInfo;
//            }
        }
        // 走到这里证明，Redis缓存中没有对应的Token信息,从数据库中查到用户信息
        PtUser userResult = findPtUserDetail(user);
        if (Objects.nonNull(userResult)) {
//            String ipAddr = userResult.getIp();
//            String ipKey = RedisKeys.getIpLimitInfo(ipAddr);
//            String id = (String) redisUtil.get(ipKey);
//            if(StringUtils.isNotBlank(id) && !id.equals(userResult.getId())){
//                throw new BusinessException("检测到当前ip有多个用户请求");
//            }
            redisUtil.set(userKey, userResult, RedisUtil.TTL_MIN_3);
//            redisUtil.set(ipKey,userResult.getId(),RedisUtil.TTL_MIN_3);
        }
        return userResult;
    }


    /**
     * 获取用户详细信息
     *
     * @param user
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public PtUser findPtUserDetail(PtUser user) {
        SeUser seUser = userService.findUserById(user.getId());
        if (Objects.isNull(seUser)) {
            throw new TokenExpireException("用户不存在");
        }
        PtUser ptUser = new PtUser();
        BeanUtils.copyProperties(seUser, ptUser);
        ptUser.setToken(user.getToken());
        ptUser.setIp(user.getIp());
        seUser.setLoginIp(user.getIp());
//        userService.updateUser(seUser);
        return ptUser;
    }

}
